Micron Document
πŸŽ–οΈGitΠ―Ρ€Π°πŸŽ–οΈ

Node / meshtastic / Meshtastic-Android / files / feature / settings / settings-validation.md

Displaying Rendered β€’ View raw β€’ Download

feature/settings/settings-validation.md 936be3998f0fe49f58b8a0f9ff2c01e3cbd85609 (936be399) Text, 24.45 KB

Settings Screen Validation Reference

This document describes the validation rules enforced on each radio configuration and module
configuration settings screen. Constraints are sourced from two layers:

1. Protobuf schema β€” field types, enums, and T383838max_size annotations defined in the
T383838meshtastic/protobufs submodule.
2. UI form layer β€” additional range checks, conditional visibility, and interval pickers
implemented in T383838feature/settings/src/commonMain/.../radio/component/.

β”‚ Reusable components live in T383838core/ui/.../component/. Each component enforces its own validation
β”‚ strategy (see UI Component β”‚ Validation
β”‚ at the bottom).


Table of Contents

β€’ User
β€’ Device
β€’ Position
β€’ Power
β€’ Network
β€’ Display
β€’ LoRa
β€’ Bluetooth
β€’ Security
β€’ MQTT
β€’ Serial
β€’ Range Test
β€’ Telemetry
β€’ Audio
β€’ Neighbor Info
β€’ Paxcounter
β€’ TAK


Device Config Screens

User (T383838Config.UserConfig)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ T383838long_name β”‚ String β”‚ maxSize: 39 bytes (proto max_size: 40) β”‚ Required (non-blank) β”‚
β”‚ T383838short_name β”‚ String β”‚ maxSize: 4 bytes (proto max_size: 5) β”‚ Required (non-blank) β”‚
β”‚ T383838is_licensed β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚
β”‚ T383838is_unmessagable β”‚ Boolean β”‚ Toggle β”‚ Enabled only when device c… β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Device (T383838Config.DeviceConfig)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ T383838role β”‚ Enum β”‚ Dropdown: T383838DeviceConfig.Role entries β”‚ Router/ROUTER… β”‚
β”‚ T383838rebroadcast_mode β”‚ Enum β”‚ Dropdown: T383838RebroadcastMode entries β”‚ ALL, ALLSKIPD… β”‚
β”‚ T383838node_info_broadcast_secs β”‚ Interval β”‚ Dropdown: T383838NODE_INFO_BROADCAST intervals β”‚ See >>Position (|BT383838|FdddConfig.PositionConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Va… β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddposition_broadcast_secs|f|b β”‚ Interval β”‚ Dr… β”‚ β€” β”‚ β”‚ |BT383838|Fdddposition_broadcast_smart_enabled|f|b β”‚ Boolean β”‚ To… β”‚ Controls visibility of smart broadcast… β”‚ β”‚ |BT383838|Fdddbroadcast_smart_minimum_interval_secs|f|b β”‚ Interval β”‚ Dr… β”‚ Visible only when smart broadcast enab… β”‚ β”‚ |BT383838|Fdddbroadcast_smart_minimum_distance|f|b β”‚ Integer β”‚ Nu… β”‚ Visible only when smart broadcast enab… β”‚ β”‚ |BT383838|Fdddfixed_position|f|b β”‚ Boolean β”‚ To… β”‚ Controls visibility of lat/lon/alt vs … β”‚ β”‚ |BT383838|Fdddlatitude|f|b β”‚ Double β”‚ Ra… β”‚ Visible only when |BT383838|Fdddfixed_position = true|f|b β”‚ β”‚ |BT383838|Fdddlongitude|f|b β”‚ Double β”‚ Ra… β”‚ Visible only when |BT383838|Fdddfixed_position = true|f|b β”‚ β”‚ |BT383838|Fdddaltitude|f|b β”‚ Integer β”‚ Nu… β”‚ Visible only when |BT383838|Fdddfixed_position = true|f|b β”‚ β”‚ |BT383838|Fdddgps_mode|f|b β”‚ Enum β”‚ Dr… β”‚ Visible only when |BT383838|Fdddfixed_position = fal|f|b… β”‚ β”‚ |BT383838|Fdddgps_update_interval|f|b β”‚ Interval β”‚ Dr… β”‚ Visible only when |BT383838|Fdddfixed_position = fal|f|b… β”‚ β”‚ |BT383838|Fdddposition_flags|f|b β”‚ Bitwise β”‚ Ch… β”‚ Bitwise OR of selected flags β”‚ β”‚ |BT383838|Fdddrx_gpio|f|b β”‚ Integer β”‚ Dr… β”‚ β€” β”‚ β”‚ |BT383838|Fdddtx_gpio|f|b β”‚ Integer β”‚ Dr… β”‚ β€” β”‚ β”‚ |BT383838|Fdddgps_en_gpio|f|b β”‚ Integer β”‚ Dr… β”‚ β€” β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ |a >>>Power (|BT383838|FdddConfig.PowerConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddis_power_saving|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddon_battery_shutdown_after_secs|f|b β”‚ Interval β”‚ Dropdown: |BT383838|FdddALL|f|b intervals β”‚ β€” β”‚ β”‚ |BT383838|Fdddadc_multiplier_override|f|b β”‚ Float β”‚ Must be > 0.0 when enabled β”‚ Checkbox + float … β”‚ β”‚ |BT383838|Fdddwait_bluetooth_secs|f|b β”‚ Interval β”‚ Dropdown: |BT383838|FdddNAG_TIMEOUT|f|b intervals β”‚ 0s–60s β”‚ β”‚ |BT383838|Fdddsds_secs|f|b β”‚ Interval β”‚ Dropdown: |BT383838|FdddALL|f|b intervals β”‚ β€” β”‚ β”‚ |BT383838|Fdddmin_wake_secs|f|b β”‚ Interval β”‚ Dropdown: |BT383838|FdddNAG_TIMEOUT|f|b intervals β”‚ 0s–60s β”‚ β”‚ |BT383838|Fddddevice_battery_ina_address|f|b β”‚ Integer β”‚ Numeric input (I2C address) β”‚ β€” β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ |a >>>Network (|BT383838|FdddConfig.NetworkConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddwifi_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ Controls visibility o… β”‚ β”‚ |BT383838|Fdddwifi_ssid|f|b β”‚ String β”‚ maxSize: 32 bytes (proto max_size: 33) β”‚ Visible when |BT383838|Fdddwifi_ena|f|b… β”‚ β”‚ |BT383838|Fdddwifi_psk|f|b β”‚ Password β”‚ maxSize: 64 bytes (proto max_size: 65) β”‚ Visible when |BT383838|Fdddwifi_ena|f|b… β”‚ β”‚ |BT383838|Fdddeth_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ Visible only when dev… β”‚ β”‚ |BT383838|Fdddntp_server|f|b β”‚ String β”‚ maxSize: 32 bytes (proto max_size: 33) β”‚ β€” β”‚ β”‚ |BT383838|Fdddrsyslog_server|f|b β”‚ String β”‚ maxSize: 32 bytes (proto max_size: 33) β”‚ β€” β”‚ β”‚ |BT383838|Fdddaddress_mode|f|b β”‚ Enum β”‚ Dropdown: |BT383838|FdddAddressMode|f|b (DHCP, STATIC) β”‚ Controls visibility o… β”‚ β”‚ |BT383838|Fdddipv4_config.ip|f|b β”‚ IPv4 β”‚ Regex: |BT383838|Fdddd{1,3}.d{1,3}.d{1,3}.d{1,3}|f|b β”‚ Visible when |BT383838|Fdddaddress_|f|b… β”‚ β”‚ |BT383838|Fdddipv4_config.gateway|f|b β”‚ IPv4 β”‚ Same regex β”‚ Visible when |BT383838|Fdddaddress_|f|b… β”‚ β”‚ |BT383838|Fdddipv4_config.subnet|f|b β”‚ IPv4 β”‚ Same regex β”‚ Visible when |BT383838|Fdddaddress_|f|b… β”‚ β”‚ |BT383838|Fdddipv4_config.dns|f|b β”‚ IPv4 β”‚ Same regex β”‚ Visible when |BT383838|Fdddaddress_|f|b… β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ |a >>>Display (|BT383838|FdddConfig.DisplayConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddscreen_on_secs|f|b β”‚ Interval β”‚ Dropdown: |BT383838|FdddDISPLAY_SCREEN_ON|f|b inte… β”‚ 15s – Always On β”‚ β”‚ |BT383838|Fdddauto_screen_carousel_secs|f|b β”‚ Interval β”‚ Dropdown: |BT383838|FdddDISPLAY_CAROUSEL|f|b inter… β”‚ 0 (disabled) – 15 min β”‚ β”‚ |BT383838|Fdddcompass_north_top|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fddduse_12h_clock|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddheading_bold|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddunits|f|b β”‚ Enum β”‚ Dropdown: |BT383838|FdddDisplayUnits|f|b entries β”‚ Metric / Imperial β”‚ β”‚ |BT383838|Fdddwake_on_tap_or_motion|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddflip_screen|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fddddisplaymode|f|b β”‚ Enum β”‚ Dropdown: |BT383838|FdddDisplayMode|f|b entries β”‚ β€” β”‚ β”‚ |BT383838|Fdddoled|f|b β”‚ Enum β”‚ Dropdown: |BT383838|FdddOledType|f|b entries β”‚ β€” β”‚ β”‚ |BT383838|Fdddcompass_orientation|f|b β”‚ Enum β”‚ Dropdown: |BT383838|FdddCompassOrientation|f|b ent… β”‚ β€” β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ |a >>>LoRa (|BT383838|FdddConfig.LoRaConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddregion|f|b β”‚ Enum β”‚ Dropdown: |BT383838|FdddRegionInfo|f|b entries β”‚ Regional frequency pl… β”‚ β”‚ |BT383838|Fddduse_preset|f|b β”‚ Boolean β”‚ Toggle β”‚ Controls manual vs pr… β”‚ β”‚ |BT383838|Fdddmodem_preset|f|b β”‚ Enum β”‚ Dropdown: |BT383838|FdddChannelOption|f|b entries β”‚ Visible only when |BT383838|Fddduse|f|b… β”‚ β”‚ |BT383838|Fdddbandwidth|f|b β”‚ Integer β”‚ Numeric input β”‚ Visible only when |BT383838|Fddduse|f|b… β”‚ β”‚ |BT383838|Fdddspread_factor|f|b β”‚ Integer β”‚ Numeric input β”‚ Visible only when |BT383838|Fddduse|f|b… β”‚ β”‚ |BT383838|Fdddcoding_rate|f|b β”‚ Integer β”‚ Numeric input β”‚ Visible only when |BT383838|Fddduse|f|b… β”‚ β”‚ |BT383838|Fdddhop_limit|f|b β”‚ Integer β”‚ Dropdown: 0–7 β”‚ β€” β”‚ β”‚ |BT383838|Fdddchannel_num|f|b β”‚ Integer β”‚ Numeric input; must be ≀ |BT383838|FdddnumChannels|f|b β”‚ β€” β”‚ β”‚ |BT383838|Fdddtx_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddtx_power|f|b β”‚ Integer β”‚ Signed integer input (dBm) β”‚ β€” β”‚ β”‚ |BT383838|Fdddoverride_duty_cycle|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddoverride_frequency|f|b β”‚ Float β”‚ MHz value β”‚ β€” β”‚ β”‚ |BT383838|Fdddsx126x_rx_boosted_gain|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddignore_mqtt|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddconfig_ok_to_mqtt|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddpa_fan_disabled|f|b β”‚ Boolean β”‚ Toggle β”‚ Visible only when dev… β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ |a >>>Bluetooth (|BT383838|FdddConfig.BluetoothConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddenabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddmode|f|b β”‚ Enum β”‚ Dropdown: |BT383838|FdddPairingMode|f|b entries (excl. UNRECOGNIZED) β”‚ β€” β”‚ β”‚ |BT383838|Fdddfixed_pin|f|b β”‚ String β”‚ Exactly 6 digits β”‚ β€” β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”˜ |a >>>Security (|BT383838|FdddConfig.SecurityConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddpublic_key|f|b β”‚ Base64 β”‚ 32 bytes; read-only β”‚ Auto-derived from priv… β”‚ β”‚ |BT383838|Fdddprivate_key|f|b β”‚ Base64 β”‚ 32 bytes β”‚ Key generation applies… β”‚ β”‚ |BT383838|Fdddadmin_key|f|b β”‚ Base64 list β”‚ maxCount: 3; each entry 32 bytes β”‚ β€” β”‚ β”‚ |BT383838|Fdddserial_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fddddebug_log_api_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddadmin_channel_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddis_managed|f|b β”‚ Boolean β”‚ Toggle β”‚ Enabled only when |BT383838|Fdddadmi|f|b… β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ |a - >>Module Config Screens >>>MQTT (|BT383838|FdddModuleConfig.MQTTConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ No… β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddenabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddaddress|f|b β”‚ String β”‚ maxSize: 63 bytes (proto max_size: 64) β”‚ No… β”‚ β”‚ |BT383838|Fdddusername|f|b β”‚ String β”‚ maxSize: 63 bytes (proto max_size: 64) β”‚ β€” β”‚ β”‚ |BT383838|Fdddpassword|f|b β”‚ Password β”‚ maxSize: 63 bytes (proto max_size: 64) β”‚ β€” β”‚ β”‚ |BT383838|Fdddencryption_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddjson_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddtls_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ Au… β”‚ β”‚ |BT383838|Fdddroot|f|b β”‚ String β”‚ maxSize: 31 bytes (proto max_size: 32) β”‚ MQ… β”‚ β”‚ |BT383838|Fdddproxy_to_client_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddmap_reporting_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ Co… β”‚ β”‚ |BT383838|Fdddmap_report_settings.publish_interval_|f|b… β”‚ Integer β”‚ Minimum: 3600 seconds (1 hour) β”‚ β€” β”‚ β”‚ |BT383838|Fdddmap_report_settings.position_precision|f|b β”‚ Integer β”‚ Slider: 12–15 bits β”‚ β€” β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”˜ |a >>>Serial (|BT383838|FdddModuleConfig.SerialConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddenabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddecho|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddrxd|f|b β”‚ Integer β”‚ Numeric input (GPIO) β”‚ β€” β”‚ β”‚ |BT383838|Fdddtxd|f|b β”‚ Integer β”‚ Numeric input (GPIO) β”‚ β€” β”‚ β”‚ |BT383838|Fdddbaud|f|b β”‚ Enum β”‚ Dropdown: |BT383838|FdddSerial_Baud|f|b entries β”‚ β€” β”‚ β”‚ |BT383838|Fdddtimeout|f|b β”‚ Integer β”‚ Numeric input β”‚ β€” β”‚ β”‚ |BT383838|Fdddmode|f|b β”‚ Enum β”‚ Dropdown: |BT383838|FdddSerial_Mode|f|b entries β”‚ β€” β”‚ β”‚ |BT383838|Fdddoverride_console_serial_port|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”˜ |a >>>External Notification (|BT383838|FdddModuleConfig.ExternalNotificationConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddenabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddalert_message|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddalert_message_buzzer|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddalert_message_vibra|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddalert_bell|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddalert_bell_buzzer|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddalert_bell_vibra|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddoutput|f|b β”‚ Integer β”‚ Dropdown: GPIO pins 0–48 β”‚ Shows |BT383838|Fdddactive|f|b field when β‰  0 β”‚ β”‚ |BT383838|Fdddactive|f|b β”‚ Boolean β”‚ Toggle β”‚ Visible when |BT383838|Fdddoutput β‰  0|f|b β”‚ β”‚ |BT383838|Fdddoutput_buzzer|f|b β”‚ Integer β”‚ Dropdown: GPIO pins 0–48 β”‚ Shows |BT383838|Fddduse_pwm|f|b field when β‰  0 β”‚ β”‚ |BT383838|Fddduse_pwm|f|b β”‚ Boolean β”‚ Toggle β”‚ Visible when |BT383838|Fdddoutput_buzzer β‰  0|f|b β”‚ β”‚ |BT383838|Fdddoutput_vibra|f|b β”‚ Integer β”‚ Dropdown: GPIO pins 0–48 β”‚ β€” β”‚ β”‚ |BT383838|Fdddoutput_ms|f|b β”‚ Interval β”‚ Dropdown: |BT383838|FdddOUTPUT|f|b intervals β”‚ 0s–10s β”‚ β”‚ |BT383838|Fdddnag_timeout|f|b β”‚ Interval β”‚ Dropdown: |BT383838|FdddNAG_TIMEOUT|f|b interv… β”‚ 0s–60s β”‚ β”‚ |BT383838|Fdddringtone|f|b β”‚ String β”‚ maxSize: 230 bytes β”‚ RTTTL format β”‚ β”‚ |BT383838|Fddduse_i2s_as_buzzer|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ |a >>>Store & Forward (|BT383838|FdddModuleConfig.StoreForwardConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddenabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddheartbeat|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddrecords|f|b β”‚ Integer β”‚ Numeric input β”‚ β€” β”‚ β”‚ |BT383838|Fdddhistory_return_max|f|b β”‚ Integer β”‚ Numeric input β”‚ β€” β”‚ β”‚ |BT383838|Fdddhistory_return_window|f|b β”‚ Integer β”‚ Numeric input (seconds) β”‚ β€” β”‚ β”‚ |BT383838|Fdddis_server|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”˜ |a >>>Range Test (|BT383838|FdddModuleConfig.RangeTestConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddenabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddsender|f|b β”‚ Interval β”‚ Dropdown: |BT383838|FdddRANGE_TEST_SENDER|f|b intervals β”‚ 0 (disabled) – 1 hour β”‚ β”‚ |BT383838|Fdddsave|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ |a >>>Telemetry (|BT383838|FdddModuleConfig.TelemetryConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fddddevice_telemetry_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ Visible only… β”‚ β”‚ |BT383838|Fddddevice_update_interval|f|b β”‚ Interval β”‚ Dropdown: |BT383838|FdddBROADCAST_SHORT|f|b intervals β”‚ 30 min – 72 … β”‚ β”‚ |BT383838|Fdddenvironment_measurement_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddenvironment_update_interval|f|b β”‚ Interval β”‚ Dropdown: |BT383838|FdddBROADCAST_SHORT|f|b intervals β”‚ 30 min – 72 … β”‚ β”‚ |BT383838|Fdddenvironment_screen_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddenvironment_display_fahrenheit|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddair_quality_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddair_quality_interval|f|b β”‚ Interval β”‚ Dropdown: |BT383838|FdddBROADCAST_SHORT|f|b intervals β”‚ 30 min – 72 … β”‚ β”‚ |BT383838|Fdddpower_measurement_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddpower_update_interval|f|b β”‚ Interval β”‚ Dropdown: |BT383838|FdddBROADCAST_SHORT|f|b intervals β”‚ 30 min – 72 … β”‚ β”‚ |BT383838|Fdddpower_screen_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ |a >>>Canned Message (|BT383838|FdddModuleConfig.CannedMessageConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddenabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddrotary1_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddinputbroker_pin_a|f|b β”‚ Integer β”‚ Numeric input (GPIO) β”‚ β€” β”‚ β”‚ |BT383838|Fdddinputbroker_pin_b|f|b β”‚ Integer β”‚ Numeric input (GPIO) β”‚ β€” β”‚ β”‚ |BT383838|Fdddinputbroker_pin_press|f|b β”‚ Integer β”‚ Numeric input (GPIO) β”‚ β€” β”‚ β”‚ |BT383838|Fdddinputbroker_event_press|f|b β”‚ Enum β”‚ Dropdown: |BT383838|FdddInputEventChar|f|b e… β”‚ β€” β”‚ β”‚ |BT383838|Fdddinputbroker_event_cw|f|b β”‚ Enum β”‚ Dropdown: |BT383838|FdddInputEventChar|f|b e… β”‚ β€” β”‚ β”‚ |BT383838|Fdddinputbroker_event_ccw|f|b β”‚ Enum β”‚ Dropdown: |BT383838|FdddInputEventChar|f|b e… β”‚ β€” β”‚ β”‚ |BT383838|Fdddupdown1_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddallow_input_source|f|b β”‚ String β”‚ maxSize: 63 bytes (proto m… β”‚ β€” β”‚ β”‚ |BT383838|Fdddsend_bell|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddmessages|f|b β”‚ String β”‚ maxSize: 200 bytes (proto … β”‚ Pipe-delimited canned messages β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ |a >>>Audio (|BT383838|FdddModuleConfig.AudioConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddcodec2_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddptt_pin|f|b β”‚ Integer β”‚ Numeric input (GPIO) β”‚ β€” β”‚ β”‚ |BT383838|Fdddbitrate|f|b β”‚ Enum β”‚ Dropdown: |BT383838|FdddAudio_Baud|f|b entries β”‚ β€” β”‚ β”‚ |BT383838|Fdddi2s_ws|f|b β”‚ Integer β”‚ Numeric input (GPIO) β”‚ β€” β”‚ β”‚ |BT383838|Fdddi2s_sd|f|b β”‚ Integer β”‚ Numeric input (GPIO) β”‚ β€” β”‚ β”‚ |BT383838|Fdddi2s_din|f|b β”‚ Integer β”‚ Numeric input (GPIO) β”‚ β€” β”‚ β”‚ |BT383838|Fdddi2s_sck|f|b β”‚ Integer β”‚ Numeric input (GPIO) β”‚ β€” β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”˜ |a >>>Remote Hardware (|BT383838|FdddModuleConfig.RemoteHardwareConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddenabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddallow_undefined_pin_access|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddavailable_pins|f|b β”‚ Pin list β”‚ maxCount: 4 β”‚ Each pin: gpio 0–255, name maxSize 14 byt… β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ |a >>>Neighbor Info (|BT383838|FdddModuleConfig.NeighborInfoConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddenabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddupdate_interval|f|b β”‚ Integer β”‚ Numeric input (seconds) β”‚ β€” β”‚ β”‚ |BT383838|Fdddtransmit_over_lora|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”˜ |a >>>Ambient Lighting (|BT383838|FdddModuleConfig.AmbientLightingConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddled_state|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddcurrent|f|b β”‚ Integer β”‚ Numeric input β”‚ β€” β”‚ β”‚ |BT383838|Fdddred|f|b β”‚ Integer β”‚ Numeric input (0–255) β”‚ β€” β”‚ β”‚ |BT383838|Fdddgreen|f|b β”‚ Integer β”‚ Numeric input (0–255) β”‚ β€” β”‚ β”‚ |BT383838|Fdddblue|f|b β”‚ Integer β”‚ Numeric input (0–255) β”‚ β€” β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”˜ |a >>>Detection Sensor (|BT383838|FdddModuleConfig.DetectionSensorConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddenabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddminimum_broadcast_secs|f|b β”‚ Interval β”‚ Dropdown: |BT383838|FdddDETECTION_SENSOR_MINIMUM|f|b i… β”‚ 0 (unset) – 72 hours β”‚ β”‚ |BT383838|Fdddstate_broadcast_secs|f|b β”‚ Interval β”‚ Dropdown: |BT383838|FdddDETECTION_SENSOR_STATE|f|b int… β”‚ 0 (unset) – 72 hours β”‚ β”‚ |BT383838|Fdddsend_bell|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddname|f|b β”‚ String β”‚ maxSize: 19 bytes (proto max_size: 2… β”‚ β€” β”‚ β”‚ |BT383838|Fdddmonitor_pin|f|b β”‚ Integer β”‚ Dropdown: GPIO pins 0–48 β”‚ β€” β”‚ β”‚ |BT383838|Fddddetection_trigger_type|f|b β”‚ Enum β”‚ Dropdown: |BT383838|FdddTriggerType|f|b entries β”‚ β€” β”‚ β”‚ |BT383838|Fddduse_pullup|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ |a >>>Paxcounter (|BT383838|FdddModuleConfig.PaxcounterConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddenabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddpaxcounter_update_interval|f|b β”‚ Interval β”‚ Dropdown: |BT383838|FdddPAX_COUNTER|f|b intervals β”‚ 15 min – 72 hours β”‚ β”‚ |BT383838|Fdddwifi_threshold|f|b β”‚ Integer β”‚ Signed integer (RSSI dBm) β”‚ Default: βˆ’80 β”‚ β”‚ |BT383838|Fdddble_threshold|f|b β”‚ Integer β”‚ Signed integer (RSSI dBm) β”‚ Default: βˆ’80 β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ |a >>>Status Message (|BT383838|FdddModuleConfig.StatusMessageConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddnode_status|f|b β”‚ String β”‚ maxSize: 80 bytes β”‚ Clearable; requires |BT383838|FdddsupportsStatusMessage|f|b capability β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ |a >>>Traffic Management (|BT383838|FdddModuleConfig.TrafficManagementConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddenabled|f|b β”‚ Boolean β”‚ Toggle β”‚ Requires |BT383838|FdddsupportsTraffi|f|b… β”‚ β”‚ |BT383838|Fdddposition_dedup_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddposition_precision_bits|f|b β”‚ Integer β”‚ Numeric input β”‚ β€” β”‚ β”‚ |BT383838|Fdddposition_min_interval_secs|f|b β”‚ Integer β”‚ Numeric input (seconds) β”‚ β€” β”‚ β”‚ |BT383838|Fdddnodeinfo_direct_response|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddnodeinfo_direct_response_max_hops|f|b β”‚ Integer β”‚ Numeric input β”‚ β€” β”‚ β”‚ |BT383838|Fdddrate_limit_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddrate_limit_window_secs|f|b β”‚ Integer β”‚ Numeric input (seconds) β”‚ β€” β”‚ β”‚ |BT383838|Fdddrate_limit_max_packets|f|b β”‚ Integer β”‚ Numeric input β”‚ β€” β”‚ β”‚ |BT383838|Fddddrop_unknown_enabled|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddunknown_packet_threshold|f|b β”‚ Integer β”‚ Numeric input β”‚ β€” β”‚ β”‚ |BT383838|Fdddexhaust_hop_telemetry|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddexhaust_hop_position|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β”‚ |BT383838|Fdddrouter_preserve_hops|f|b β”‚ Boolean β”‚ Toggle β”‚ β€” β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ |a >>>TAK (|BT383838|FdddModuleConfig.TAKConfig|f|b) |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddteam|f|b β”‚ Enum β”‚ Dropdown with custom colors/labels β”‚ Only shown when device role is |BT383838|FdddTAK|f|b or |BT383838|FdddTAK_T|f|b… β”‚ β”‚ |BT383838|Fdddrole|f|b β”‚ Enum β”‚ Dropdown with custom labels β”‚ Only shown when device role is |BT383838|FdddTAK|f|b or |BT383838|FdddTAK_T|f|b… β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ |a - >>Channel Config Channel editing is handled by |BT383838|FdddEditChannelDialog|f|b. |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Field β”‚ Type β”‚ Validation β”‚ Notes β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|Fdddname|f|b β”‚ String β”‚ maxSize: 11 bytes β”‚ Empty name falls back to modem preset… β”‚ β”‚ |BT383838|Fdddpsk|f|b β”‚ ByteString β”‚ Must be exactly 0, 16, or 32 bytes β”‚ Pre-shared key for encryption β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ |a - >>Interval Configurations Time-based fields use predefined interval sets from |BT383838|FdddIntervalConfiguration|f|b. Each configuration context restricts the available choices to a specific subset of |BT383838|FdddFixedUpdateIntervals|f|b. |c β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Configuration β”‚ Range β”‚ Values (seconds) β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ |BT383838|FdddALL|f|b β”‚ 0 – 2147483647 β”‚ 0, 1, 2, 3, 4, 5, 8, 10, 15, 20, 30, 40,… β”‚ β”‚ |BT383838|FdddBROADCAST_SHORT|f|b β”‚ 30 min – 72 hr β”‚ 1800, 3600, 7200, 10800, 14400, 18000, 2… β”‚ β”‚ |BT383838|FdddBROADCAST_MEDIUM|f|b β”‚ 1 hr – 72 hr β”‚ 3600, 7200, 10800, 14400, 18000, 21600, … β”‚ β”‚ |BT383838|FdddBROADCAST_LONG|f|b β”‚ 3 hr – 72 hr β”‚ 10800, 14400, 18000, 21600, 43200, 64800… β”‚ β”‚ |BT383838|FdddNODE_INFO_BROADCAST|f|b β”‚ 0 (unset), 3 hr – 72 hr β”‚ 0, 10800, 14400, 18000, 21600, 43200, 64… β”‚ β”‚ |BT383838|FdddNAG_TIMEOUT|f|b β”‚ 0 – 60 s β”‚ 0, 1, 5, 10, 15, 30, 60 β”‚ β”‚ |BT383838|FdddOUTPUT|f|b β”‚ 0 – 10 s β”‚ 0, 1, 2, 3, 4, 5, 10 β”‚ β”‚ |BT383838|FdddPAX_COUNTER|f|b β”‚ 15 min – 72 hr β”‚ 900, 1800, 3600, 7200, 10800, 14400, 180… β”‚ β”‚ |BT383838|FdddPOSITION|f|b β”‚ 1 s – 1 hr β”‚ 1, 2, 5, 10, 15, 20, 30, 45, 60, 120, 30… β”‚ β”‚ |BT383838|FdddPOSITION_BROADCAST|f|b β”‚ 0 (unset), 1 min – 72 hr β”‚ 0, 60, 90, 300, 900, 3600, 7200, 10800, … β”‚ β”‚ |BT383838|FdddGPS_UPDATE|f|b β”‚ 0 (unset), 8 s – 24 hr β”‚ 0, 8, 20, 40, 60, 80, 120, 300, 600, 900… β”‚ β”‚ |BT383838|FdddRANGE_TEST_SENDER|f|b β”‚ 0 (disabled) – 1 hr β”‚ 0, 15, 30, 45, 60, 300, 600, 900, 1800, … β”‚ β”‚ |BT383838|FdddSMART_BROADCAST_MINIMUM|f|b β”‚ 15 s – 1 hr β”‚ 15, 30, 45, 60, 300, 600, 900, 1800, 3600 β”‚ β”‚ |BT383838|FdddDETECTION_SENSOR_MINIMUM|f|b β”‚ 0 (unset), 15 s – 72 hr β”‚ 0, 15, 30, 60, 120, 300, 600, 900, 1800,… β”‚ β”‚ |BT383838|FdddDETECTION_SENSOR_STATE|f|b β”‚ 0 (unset), 15 min – 72 hr β”‚ 0, 900, 1800, 3600, 7200, 10800, 14400, … β”‚ β”‚ |BT383838|FdddDISPLAY_SCREEN_ON|f|b β”‚ 15 s – Always On β”‚ 15, 30, 60, 300, 600, 900, 1800, 3600, 2… β”‚ β”‚ |BT383838|FdddDISPLAY_CAROUSEL|f|b β”‚ 0 (disabled) – 15 min β”‚ 0, 15, 30, 60, 300, 600, 900 β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ |a >>>Shared Constants β€’ |!GPIO Pins:|! 0–48 (inclusive) β€’ |!Hop Limits:|! 0–7 (inclusive) - >>UI Component Validation The reusable Compose components in |BT383838|Fdddcore/ui/.../component/|f|b provide the actual enforcement layer. Each component accepts validation parameters and rejects or flags invalid input. >>>EditTextPreference β€’ |!String mode:|! Enforces |BT383838|FdddmaxSize|f|b in UTF-8 bytes via |BT383838|FdddencodeToByteArray().size <= maxSize|f|b. Shows a live byte counter when focused. β€’ |!Int mode:|! Validates with |BT383838|FdddtoIntOrNull()|f|b; sets error icon on failure. β€’ |!Float mode:|! Validates with |BT383838|FdddtoFloatOrNull()|f|b. β€’ |!Double mode:|! Validates with |BT383838|FdddtoDoubleOrNull()|f|b; supports international decimal separators (|BT383838|Fddd.|f|b, |BT383838|Fddd,|f|b, |BT383838|FdddΩ«|f|b, |BT383838|Fddd、|f|b, |BT383838|FdddΒ·|f|b). >>>SignedIntegerEditTextPreference β€’ Validates with |BT383838|FdddtoIntOrNull()|f|b; shows error icon on invalid input. >>>DropDownPreference β€’ Closed-set selection only β€” no free-form input. β€’ Automatically filters |BT383838|FdddUNRECOGNIZED|f|b and deprecated enum entries. >>>SwitchPreference β€’ Binary toggle; inherently valid. Disabled state shown at reduced opacity. >>>SliderPreference β€’ Discrete steps only; values clamped with |BT383838|FdddcoerceIn()|f|b and rounded to the nearest valid index. >>>EditIPv4Preference β€’ Regex validation: |BT383838|Fddd\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|f|b. β€’ Stored as a little-endian |BT383838|FdddInt|f|b; displayed as dotted-decimal. >>>EditPasswordPreference β€’ Delegates to |BT383838|FdddEditTextPreference|f|b with |BT383838|FdddmaxSize|f|b enforcement and password visibility toggle. >>>EditBase64Preference β€’ Validates Base64 encoding on input. β€’ Flags all-zero 32-byte values as errors (empty/unset key). >>>BitwisePreference β€’ Closed checkbox set; toggles individual bit flags via XOR. β€’ "Clear" button resets to 0. >>>EditListPreference β€’ Enforces |BT383838|FdddmaxCount|f|b for list length. β€’ Per-element validation varies by type: |BT383838|FdddInt|f|b range 0–255 for GPIO pins, |BT383838|FdddByteString|f|b via Base64 parsing, composite |BT383838|FdddRemoteHardwarePin|f|b with nested field rules. >>>PositionPrecisionPreference β€’ State machine with three modes: disabled (0), precision range (10–19), full precision (32). β€’ Slider constrained to 10–19 with 8 discrete steps. >>>ConfigState β€’ Generic wrapper that tracks |BT383838|FdddisDirty|f|b (current value β‰  initial value). β€’ Changes are only persisted on explicit save; cancel reverts to the initial snapshot. < - |a|F666|[Served by rngit 1.5.0|:/page/index.mu">Interva - Generated in 0.2s